// const mySum = function (x: number, y: number): number {
//   return x + y
// }
// 这是可以通过编译的，不过事实上，上面的代码只对等号右侧的匿名函数进行了类型定义，
// 而等号左边的 `mySum`，是通过赋值操作进行类型推论而推断出来的
// const mySum: (x: number, y: number) => number = function (x: number, y: number): number {
//   return x + y
// }
// const mySum: (x: number, y: number) => number = (x: number, y: number): number => {
//   return x + y
// }
// (x: number, y: number) => number 定义了mySum函数的输入和输出的类型
//注意不要混淆了 TypeScript 中的 `=>` 和 ES6 中的 `=>`。

// 在 TypeScript 的类型定义中，`=>` 用来表示函数的定义，
// 左边是输入类型，需要用括号括起来，右边是输出类型

// 无返回值
// const fn: (x: string, y: number) => void = ( x: string, y: number ):void => {
//   x + y
// }


// 如果返回值是对象
// interface IPerson1 {
//   username: string
// }
// const fn: (username: string) => IPerson1 = (username: string): IPerson1 => {
//   return {
//     username: username
//   }
// }

// 用接口定义函数的形状

// interface IFn {
//   (x: string, y: number): string
// }

// const fn: IFn = (x: string, y: number): string => {
//   return x + y
// }

// 函数的可选参数
// 可选参数必须接在必需参数后面
// function fn (a: number, b: number, c?: number) {
// }

// 参数默认值
// function fn (a: number = 10, b: number = 20, c?: number) {
// }


// 重载允许一个函数接受不同数量或类型的参数时，作出不同的处理。
// function reverse(x: number | string): number | string {
//   if (typeof x === 'number') {
//   return Number(x.toString().split('').reverse().join(''))
//   } else {
//   return x.split('').reverse().join('')
//   }
// }
// 缺点，就是不能够精确的表达，输入为数字的时候，输出也应该为数字，
// 输入为字符串的时候，输出也应该为字符串。
/**
 * 
 * 重复定义了多次函数 `reverse`，前几次都是函数定义，
 * 最后一次是函数实现。在编辑器的代码提示中，可以正确的看到前两个提示。

注意，TypeScript 会优先从最前面的函数定义开始匹配，
所以多个函数定义如果有包含关系，需要优先把精确的定义写在前面。
 */
function reverse(x: number): number
function reverse(x: string): string
function reverse(x: number | string): number | string {
  if (typeof x === 'number') {
  return Number(x.toString().split('').reverse().join(''))
  } else {
  return x.split('').reverse().join('')
  }
}